﻿using System;
using System.Web.Mvc;
using BoneSystem.Business;
using BoneSystem.Business.Entity;
using BoneSystem.Business.Entity.Produto.ClassesRelacionadas;
using BoneSystem.Business.Enum;
using BoneSystem.Models;

namespace BoneSystem.Controllers
{
    public abstract class CadastroBaseController<T> : Controller where T : class, new()
    {
        /// <summary>
        /// Página inicial do cadastro.
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public virtual ActionResult Index()
        {
            //return View(RepositoryBase<T>.GetListAtivos());
            return View();
        }

        public virtual ActionResult New()
        {
            return View("Cadastro", new T());
        }

        /// <summary>
        /// Action que carrega um objeto. Caso o valor do parametro seja '0' cria um novo objeto.
        /// </summary>
        /// <param name="id">Identificador do objeto(0 para novo)</param>
        /// <returns>View de cadastro com o tipo carregado.</returns>
        [HttpGet]
        public virtual ActionResult Get(int id)
        {
            var propBase = PropertiesBaseRepository.GetById(id);
            T entity;
            if (propBase != null)
            {
                entity = RepositoryBase<T>.GetById(id);
            }
            else
            {
                entity = new T();
            }
            return View("Cadastro", entity);
            //return View("Cadastro", new Caracteristicas());

        }

        /// <summary>
        /// Action que salva um objeto no banco de dados.
        /// </summary>
        /// <param name="model">Modelo do objeto enviado pelo cliente para salvar no banco de dados</param>
        /// <returns>Retorna um valor informando se a operação foi bem sussedida.</returns>
        [HttpPost]
        public virtual JsonResult Save(T model)
        {
            if (ModelState.IsValid)
            {
                RepositoryBase<T>.Save(model);
            }

            return Json(new JSonResultModel()
            {
                Message = "Item salvo com sucesso."
            });
        }

        /// <summary>
        /// Método que exclui um objeto no banco de dados.
        /// </summary>
        /// <param name="id">Identificador do objeto para exclusão.</param>
        /// <returns>Retorna um valor informando se a exclusão foi bem sucedida.</returns>
        [HttpPost]
        public virtual JsonResult Delete(int id)
        {
            try
            {
                var entity = PropertiesBaseRepository.GetById(id);
                entity.Status = StatusEnum.Excluido;
                PropertiesBaseRepository.Save(entity);
            }
            catch (Exception ex)
            {
                return Json(new JSonResultModel()
                {
                    HasError = true,
                    Message = ex.Message
                });
            }
            return Json(new JSonResultModel()
            {
                Message = "Exclusão efetuada com sucesso."
            });
        }
    }
}